excess comma notation
The contents of any node can be checked with excess comma notation, as in the following examples:

  IF a[x, ] THEN PRINT "non-empty-node"
  IFZ j[x, y, ] THEN PRINT "empty-node"

Excess comma notation says a node is being accessed, not data.  When nodes are being accessed, excess comma notation is mandatory.  When data is begin accessed, excess comma notation is an error.  When bounds checking is enabled, node/data mismatches are caught before the offending access occurs.

How would an irregular array a%[] be created with upper bounds of a%[0,3] , a%[1,*] , a%[2,5] , a%[3,2] where * = empty-node?

The following code illustrates:

FUNCTION demo ()
  SHARED a%[]                ' let's say a%[] is a SHARED array
  DIM a%[3,]                 ' create upper dimension of a[]
  DIM a0%[3]                 ' create a0%[3] to be data in a%[0, ]
' DIM a1%[]                  ' create a1%[] to be data in a%[1, ]
  DIM a2%[5]                 ' create a2%[5] to be data in a%[2, ]
  DIM a3%[2]                 ' create a3%[2] to be data in a%[3, ]
  ATTACH a0%[] TO a%[0]     ' attach a0%[] data array to a%[0, ]
' ATTACH a1%[] TO a%[1]     ' attach a1%[] data array to a%[1, ]
  ATTACH a2%[] TO a%[2]     ' attach a2%[] data array to a%[2, ]
  ATTACH a3%[] TO a%[3]     ' attach a3%[] data array to a%[3, ]
  IF a%[0,] THEN PRINT "0"  ' will print "0"
  IF a%[1,] THEN PRINT "1"  ' will not print
  IF a%[2,] THEN PRINT "2"  ' will print "2"
  IF a%[3,] THEN PRINT "3"  ' will print "3"
END FUNCTION

The two lines commented out in the preceding example are not needed because DIM a[3,] initializes all nodes to zero.  Since a[1,] is already a empty-node, there's no need to create a empty array to attach to a[1,].

natural data type
Arrays have a natural data type, determined by type-suffix, declaration, or default.   Any access of a data element in an array is a read or write of natural type data.